/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-10-29 19:04:52 +0000 (Mon, 29 Oct 2012) $
  Revision     : $Revision: 108 $
*******************************************/

package gui.usuario;

import java.io.Serializable;

import mensaje.Mensaje;

import api.IUsuarioAPI;

import utilidad.Util;
import control.App;
import control.IPropiedadesSistema;
import core.ManejadorLog;
import frente.GrupoUsuarios;
import frente.Usuario;
import gui.dialogo.DialogoMensaje;

/**
 * Controla un panel de edicion.
 * <P>
 * Esta clase, administra la implementacion 
 * de la logica necesaria en el <code>EditarUsuarioPanel</code>.
 * 
 * @see EditarUsuarioPanel
 * 
 * @author jose.lara 07.06.2012
 */
public class EditarUsuarioPanelControlador implements Serializable {
    private static final long serialVersionUID = 3856417256112274283L;
    
    private static final int PUEDE_GUARDAR              = 0;
    private static final int NO_PUEDE_GUARDAR_VACIOS    = 1;
    private static final int NO_PUEDE_GUARDAR_LARGOS    = 2;
    private static final int NO_PUEDE_GUARDAR_CLAVE     = 3;
    private static final int NO_PUEDE_GUARDAR_GRUPO     = 4;
    private static final int LONGITUD_MD5               = 32;
    
    private EditarUsuarioPanel panel                    = null;
    
    public EditarUsuarioPanelControlador(EditarUsuarioPanel panel) {
        this.panel = panel;
    }
    
    private EditarUsuarioPanel getPanel() {
        return panel;
    }
    
    private int validacionGeneral() {
        GrupoUsuarios grupoUsuarios = null;
        String nombre               = null;
        String usuario              = null;
        String correo               = null;
        
        nombre = getPanel().getGeneral().getNombreTextField().getText();
        usuario = getPanel().getGeneral().getUsuarioTextField().getText();
        correo = getPanel().getGeneral().getCorreoTextField().getText();
        char [] clave = getPanel().getGeneral().getClavePasswordField().getPassword();
        char [] claveConf = getPanel().getGeneral().getConfirmacionClavePasswordField().getPassword();
        
        grupoUsuarios = (GrupoUsuarios) getPanel().getGeneral().getGrupoUsuariosCombo().getSelectedItem();
        
        if(!Util.cadenasValidas(nombre, correo, usuario, String.valueOf(clave), String.valueOf(claveConf))) {
            return NO_PUEDE_GUARDAR_VACIOS;
        }
        else if(!clavesIguales(clave, claveConf)) {
            return NO_PUEDE_GUARDAR_CLAVE;
        }
        else if(!Util.cadenasValidas(IPropiedadesSistema.LONGITUD_MEDIO, nombre, correo)
                || !Util.cadenasValidas(IPropiedadesSistema.LONGITUD_CORTO, usuario, String.valueOf(clave), String.valueOf(claveConf))) {
            return NO_PUEDE_GUARDAR_LARGOS;
        }
        else if(grupoUsuarios == null) {
            return NO_PUEDE_GUARDAR_GRUPO;
        }
        
        return PUEDE_GUARDAR;
    }
    
    private int validacionDatos() {
        int puede = PUEDE_GUARDAR;
        
        puede = validacionGeneral();
        
        return puede;
    }
    
    public boolean puedeGuardar() {
        return validacionDatos() == PUEDE_GUARDAR;
    }
    
    private static boolean clavesIguales(char [] clave, char [] claveConf) {
        if(clave.length != claveConf.length) {
            return false;
        }
        
        for(int indice = 0; indice < clave.length; indice++) {
            if(clave[indice] != claveConf[indice]) {
                return false;
            }
        }
        
        return true;
    }
    
    protected void guardar(Usuario usuario) {
        GrupoUsuarios grupoUsuarios = null;
        IUsuarioAPI usuarioAPI      = null;
        int puede                   = -1;
        
        try {
            puede = validacionDatos();
            
            if(puede == PUEDE_GUARDAR) {
                if(usuario == null) {
                    usuario = new Usuario();
                }
                grupoUsuarios = (GrupoUsuarios) getPanel().getGeneral().getGrupoUsuariosCombo().getSelectedItem();
                
                usuario.setClave(String.valueOf(getPanel().getGeneral().getClavePasswordField().getPassword()));
                usuario.setCorreo(getPanel().getGeneral().getCorreoTextField().getText());
                usuario.setNombre(getPanel().getGeneral().getNombreTextField().getText());
                usuario.setNombreUsuario(getPanel().getGeneral().getUsuarioTextField().getText());
                usuario.setIdGrupoUsuarios(grupoUsuarios.getId());
                
                usuarioAPI = App.getSesion().getUsuarioAPI();
                usuarioAPI.guardarUsuario(usuario, usuario.getClave().length() < LONGITUD_MD5);
            }
            else if(puede == NO_PUEDE_GUARDAR_VACIOS) {
                DialogoMensaje.mostrarMensajeError(getPanel(), Mensaje.getMensaje("ERROR_CAMPOS_V"));
            }
            else if(puede == NO_PUEDE_GUARDAR_LARGOS) {
                DialogoMensaje.mostrarMensajeError(getPanel(), Mensaje.getMensaje("ERROR_CAMPOS_L"));
            }
            else if(puede == NO_PUEDE_GUARDAR_CLAVE) {
                DialogoMensaje.mostrarMensajeError(getPanel(), Mensaje.getMensaje("ERROR_CAMPOS_COINCIDEN"));
            }
            else if(puede == NO_PUEDE_GUARDAR_GRUPO) {
                DialogoMensaje.mostrarMensajeError(getPanel(), Mensaje.getMensaje("ERROR_GRUPO_USUARIOS_VACIO"));
            }
        }
        catch(Exception e) {
            ManejadorLog.escribirErrorEnLog(e);
            DialogoMensaje.mostrarMensajeError(getPanel(), Mensaje.getMensaje("ERROR-GUARDADO"));
        }
    }
}